// #include <stdio.h>
// #include <iostream>
// #include <unistd.h>
// #include <assert.h>
// #include <pthread.h>
// using namespace std;
// int cnt=0;
// //新线程
// void* thread_routine1(void* args)
// {
//   char* name = (char*)args;
// 	while(1)
// 	{
// 		// cout << "我是新线程，我正在运行！ " << name << "cnt " << cnt << endl;
//         printf("我是新线程，我正在运行...,name=%s,cnt=%d\n", name,cnt);
// 		sleep(1);
// 	}
// }
// void* thread_routine2(void* args)
// {
//   char* name = (char*)args;
// 	while(1)
// 	{
// 		// cout << "我是新线程，我正在运行！ " << name << "cnt " << cnt << endl;
//         printf("我是新线程，我正在运行...,name=%s,cnt=%d\n", name,cnt);
// 		sleep(1);
// 	}
// }
// int main()
// {
// 	//创建线程tid
// 	pthread_t tid1,tid2;
// 	pthread_create(&tid1,nullptr,thread_routine1,(void*)"thread one ");
// 	pthread_create(&tid2,nullptr,thread_routine2,(void*)"thread two ");

// 	//主线程
// 	while(1)
// 	{
//         cnt ++ ;
// 		// cout << "我是主线程，我正在运行！" <<  "cnt " << cnt << endl;
//         printf("我是主线程，我正在运行...,cnt=%d\n",cnt);
// 		sleep(1);
// 	}
// 	return 0;
// }



// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>

// using namespace std;

// int g_val = 0; // 全局变量，在多线程场景中，我们多个线程看到的是同一个变量！ -- 为什么？

// void *threadRun1(void *args)
// {
//     while (true)
//     {
//         sleep(1);
//         cout << "t1 thread..." << getpid() << " &g_val: " << &g_val << " , g_val: " << g_val << endl;
//     }
// }

// void *threadRun2(void *args)
// {
//     // char *s = "hello bit";
//     while (true)
//     {
//         sleep(1);
//         cout << "t2 thread..." << getpid()  << " &g_val: " << &g_val << " , g_val: " << g_val++ << endl;
//         // *s = 'H'; // 让这一个线程崩溃
//     }
// }

// int main()
// {
//     pthread_t t1, t2, t3;

//     pthread_create(&t1, nullptr, threadRun1, nullptr);
//     pthread_create(&t1, nullptr, threadRun2, nullptr);

//     while (true)
//     {
//         sleep(1);
//         cout << "main thread..." << getpid()  << " &g_val: " << &g_val << " , g_val: " << g_val << endl;
//     }
// }

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <unistd.h>
#include <pthread.h>

using namespace std;

int tickets = 1000; // 加锁保证共享资源的安全
pthread_mutex_t mutex; // 互斥量（锁）

void *threadRoutine(void *name)
{
    string tname = static_cast<const char*>(name);

    while(true)
    {
        pthread_mutex_lock(&mutex); // 所有线程都要遵守这个规则
        if(tickets > 0)
        {
            //a,b,c,d
            usleep(2000); // 模拟抢票花费的时间
            cout << tname << " get a ticket: " << tickets-- << endl;
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            pthread_mutex_unlock(&mutex);
            break;
        }

        // 后面还有动作
        usleep(1000); //充当抢完一张票，后续动作
    }

    return nullptr;
}

int main()
{
    pthread_mutex_init(&mutex, nullptr);

    pthread_t t[4];
    int n = sizeof(t)/sizeof(t[0]);
    for(int i = 0; i < n; i++)
    {
        char *data = new char[64];
        snprintf(data, 64, "thread-%d", i+1);
        pthread_create(t+i, nullptr, threadRoutine, data);
    }

    for(int i = 0; i < n; i++)
    {
        pthread_join(t[i], nullptr);
    }

    pthread_mutex_destroy(&mutex);
    return 0;
}

